package com.ebupt.migu.music.api.util;

import com.alibaba.fastjson.JSONArray;
import com.ebupt.migu.music.api.entity.AutoPushBean;
import com.ebupt.migu.music.api.entity.PushCountBean;
import com.ebupt.migu.music.autoTri.Entity.ResultBean;
import com.ebupt.migu.music.common.util.HttpUtils;
import com.ebupt.migu.music.common.util.JsonUtils;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author xuhongsong
 * @version 1.0
 * @date 2020/9/27 14:12
 */
@Slf4j
@Service
public class pushCountServiceImpl implements  pushCountService{



    /**
     *  构造json 参数
     * @param pushCountBean
     * @return
     */
    private static Map<String,Object> composeMaps(PushCountBean pushCountBean){
        Map<String, Object> params=new HashMap<>();
     /*   params.put("cid",pushCountBean.getCid());
        params.put("startTime",pushCountBean.getStartTime());
        params.put("endTime",pushCountBean.getEndTime());
        params.put("signature",pushCountBean.getSignature());
        params.put("type",pushCountBean.getType());
        params.put("appKey",pushCountBean.getAppKey());
        params.put("timestamp",pushCountBean.getTimestamp());*/
        return params;
    }

    public static List<AutoPushBean> a(PushCountBean pushCountBean){
        Map<String,Object> map=composeMaps(pushCountBean);
        String url="http://39.156.1.74:8088/api/dataNew";
        String result=null;
        try {
            result=HttpUtils.doPost(url,map);
        }catch (Exception e){
            e.printStackTrace();
            log.info("调用push统计结果错误!");
        }
        if (result!=null){
            Map resultMap = JsonUtils.json2Obj(result, Map.class);
            if (resultMap.containsKey("code") && resultMap.get("code").equals("200")){
                // 调用成功
                String  dataResult=getKey(resultMap,"data");
                if (dataResult!=null) {
                    JSONArray jsonArray = (JSONArray) resultMap.get("data");
                    Map arrayMap;
                    Map dataMap;
                    List<AutoPushBean> list=new ArrayList<>();
                    AutoPushBean autoPushBean;
                    for (int i=0;i<jsonArray.size();i++) {
                       arrayMap = JsonUtils.json2Obj(jsonArray.get(i).toString(), Map.class);
                       autoPushBean=new AutoPushBean();
                       // 在type=1时返回消息id
                       autoPushBean.setCid(arrayMap.get("key").toString());
                       // 总推送条数
                    //   String total_send=arrayMap.get("total_send").toString();
                       // 实际推送条数
                   //    String actual_send=arrayMap.get("actual_send").toString();
                        // 消息实际下发数/成功下发次数
                        autoPushBean.setOnlineNum(StringToInt(arrayMap.get("actual_send").toString()));
                       // 在线推送条数
                     //  String online_num=arrayMap.get("online_num").toString();
                       //  离线推送条数
                    //   String offline_num=arrayMap.get("offline_num").toString();
                       //  在线抵达条数
                    //   String online_reach_num=arrayMap.get("online_reach_num").toString();
                       //  在线点击条数
                       String online_click_num=arrayMap.get("online_click_num").toString();
                       //  离线抵达条数
                   //    String offline_reach_num=arrayMap.get("offline_reach_num").toString();
                       //  离线点击条数
                       String offline_click_num=arrayMap.get("offline_click_num").toString();
                       //  展示数
                       DecimalFormat df = new DecimalFormat("0.00");
                       double totalCrv = 0.00;
                       Integer totalClicked=StringToInt(online_click_num)+StringToInt(offline_click_num);
                       if (arrayMap.get("show_num")!=null){
                           Integer   showNums=StringToInt(arrayMap.get("show_num").toString());
                           autoPushBean.setTotalDisplayed(showNums);
                           // 转化率=点击数/展示数
                           if (showNums!=0){
                               totalCrv = Double.parseDouble(df.format((float) totalClicked / showNums * 100));
                           }
                           autoPushBean.setTotalCrv(totalCrv);
                       }
                       //  data
                       JSONArray dataArray=(JSONArray)arrayMap.get("data");
                       for (int j=0;j<dataArray.size();j++){
                           dataMap = JsonUtils.json2Obj(dataArray.get(j).toString(), Map.class);
                           // 1 ios  2 Android
                           int type=Integer.parseInt(dataMap.get("type").toString());
                           //  总推送条数
                           String totalSend=dataMap.get("total_send").toString();
                           //  实际推送条数
                           String actualsend=dataMap.get("actual_send").toString();
                           //  在线推送条数
                       //    String onlineNum=dataMap.get("online_num").toString();
                           //  离线推送条数
                           String offlineNum=dataMap.get("offline_num").toString();
                           //  在线点击条数
                           String onlineReachNum=dataMap.get("online_reach_num").toString();
                           //  在线抵达条数
                        //   String onlineClickNum=dataMap.get("online_click_num").toString();
                           //  离线抵达条数
                    //       String offlineReachNum=dataMap.get("offline_reach_num").toString();
                           //  离线点击条数
                           String offlineClickNum=dataMap.get("offline_click_num").toString();
                           //  type=1 ios展示数/type=2 Android展示数
                           Integer showNum=StringToInt(dataMap.get("show_num").toString());
                           // type=1 ios总点击数/type=2 Android总点击数  包括在线点击数+离线点击数
                           int totalClickNum=StringToInt(onlineReachNum)+StringToInt(offlineClickNum);
                           double crv = 0.00;
                           if (showNum!=0){
                               crv = Double.parseDouble(df.format((float) totalClickNum / showNum * 100));
                           }
                           switch (type){
                               case 1:
                                   autoPushBean.setIosClicked(totalClickNum);
                                   autoPushBean.setIosSend(StringToInt(actualsend));
                                   autoPushBean.setIosDisplayed(showNum);
                                   autoPushBean.setIosCrv(crv);
                                   break;
                               case 2:
                                   autoPushBean.setAndroidClicked(totalClickNum);
                                   autoPushBean.setAndroidDisplayed(showNum);
                                   autoPushBean.setAndroidSend(StringToInt(actualsend));
                                   autoPushBean.setAndroidCrv(crv);
                                   break;
                           }
                       }
                        list.add(autoPushBean);
                    }
                   return  list;
                }
                return null;
            }
            return null;
        }
        return null;
    }

    /**
     *  返回key对应的值
     * @param map
     * @param key
     * @return
     */
    private static String getKey(Map<String,Object> map,String key){
      if (map.containsKey(key)){
          if (map.get(key)!=null) {
              return map.get(key).toString();
          }
          return null;
      }
      return null;
    }    /**
     *   判断
     * @return
     */
    private static Integer StringToInt(String str){
       return StringUtils.isNotBlank(str)?Integer.parseInt(str):0;
    }


    /**
     *   转化为PushCountBean对象集合
     * @param list
     * @return
     */
    private List<PushCountBean> toResultList(List<String> list){
        return  list.stream().map(e->toPushCountBean(e)).collect(Collectors.toList());
    }


    /**
     *   字符串分割并组成对象
     * @param str
     * @return
     */
    private  PushCountBean toPushCountBean(String  str){
         String[]  strs=str.split(",");
        return   new PushCountBean(strs[0],strs[1],strs[2],strs[3],strs[4],strs[5],strs[6],strs[7],strs[8]);
    }


    private   Map<Integer,List<PushCountBean>>  a(List<PushCountBean> PushCountBeanLists){
        //  首先将cid 分组（这是去重过后的cid）
        List<String>  cidLidst=PushCountBeanLists.stream().map(PushCountBean::getCid).distinct().collect(Collectors.toList());
        return null;
    }



    /*private Map<String,Object>   b(List<PushCountBean> PushCountBeanLists,String cid){
        //  获取当前cid 对应的消息实际下发数/成功下发次数
        //  在线点击条数
        //  离线点击条数
    }*/

}
